/**
 * 字典数据、字典元数据结构定义
 *@author MuYi
 *@date 2023-3-15 21:14:12
 *@version 1.0
 **/
/**
 * 后台返回数据结构，即标签和值，可能使用的字段名
 */
export const DictDataDefaultField = {
    /**
     * 默认标签字段
     */
    LABEL: ['label', 'name', 'title'],
    /**
     * 默认值字段
     */
    VALUE: ['value', 'id', 'uid', 'key'],

}
/**
 * 字典集合数据结构
 * @constructor
 */
export const DictClassData = () => {
    return {
        owner: null,
        label: {},
        type: {}
    }
}

/**
 *   字典集合类
 * @property {Object} label 字典 {字典类型名:{值：标签...}...}对象集合
 * @property {Object} dict 字典对象 {字典类型名:{}:DictData ...}字典集合
 * @property {Array.<DictMeta>} _dictMetas 字典元数据数组
 */
export class Dict {
    private owner: null;
    public label: {};
    public type: {};

    /**
     *
     * @param typeName 指定有效时(非null或‘’），type、label数组同时初始化一个该类型名的属性
     */
    constructor(typeName?: string) {
        this.owner = null;
        this.label = {};
        this.type = {};
        if (typeName && typeName.trim() != '') {
            let name = typeName.trim();
            if (name != '') {
                this.label[name] = {};
                this.type[name] = [];
            }
        }
    }
}


/**
 * 字典数据单项结构定义
 * @property label{string} 标签
 * @property text{string} 标签，与label相同。以便直接把值付给el-table-column的filters
 * @property value {*} 值
 * @property raw 原始数据(后台java的DictData类)
 **/
export class DictData {
    label: string;
    text: string;
    value: string | number;
    raw: object;

    /**
     *
     * @param label 标签值
     * @param value 字典值
     * @param raw 原始数据
     */
    constructor(label: string, value: string | number, raw: object) {
        this.label = label
        this.text = this.label
        this.value = value
        this.raw = raw
    }
}


/**
 * 字典元数据
 * @property {String} type 类型
 * @property {Function} request 请求
 * @property {Function} responseConverter 后台数据映射方法
 * @property {String} label 标签字段
 * @property {String} value 值字段
 */
export class DictMeta {
    type: string;
    labelField: string;
    valueField: string;
    public request: object;

    /**
     *
     * @param typeName 类型
     * @param labelField 标签字段
     * @param valueField 值字段
     */
    constructor(typeName: string, labelField: string, valueField: string) {
        this.type = typeName;
        this.labelField = labelField
        this.valueField = valueField
    }
}

